
package com.miracle.erp.filter;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.miracle.erp.model.User;
import com.miracle.erp.util.HttpFilter;


// * 拦截所有请求
// 需要写一个父类 工具类
@WebFilter("/*")
public class LoginFilter extends HttpFilter{
	// 首先要明白 什么样的信息需要拦截
	// 请求登陆的要放行

	// 保存不需要拦截的路由  解决硬代码(成员变量)
	private List <String> paths;

	// 覆写 init方法
	@Override
	public void init() throws ServletException {
		// 获取当前不需要拦截的路由
		String  filterPath = getFilterConfig().getServletContext().getInitParameter("filterPath");
		// 把路由们封装起来
		String [] paths = filterPath.split(",");
		// 把数组转为集合
		this.paths = Arrays.asList(paths);
	}



	@Override
	public void doFilter(HttpServletRequest req, HttpServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		// 获取当前路由
		String servletPath = req.getServletPath();
		// 控制台打印路由
		System.out.println(servletPath);

		// 需要放行的路由
//		if (servletPath.equals("/login.jsp") || servletPath.equals("/login")|| servletPath.equals("/resources")) {
//			// 放行
//			chain.doFilter(req, resp);
//			return;
//	}

		// 判断需要放行的路由 是否包含其中
		if (paths.contains(servletPath)||servletPath.startsWith("/resource")){
			// 放行
			chain.doFilter(req, resp);
			return;
		}


				// 校验登陆
				HttpSession session = req.getSession();
				// 设置登陆信息 在login中 封装到user
				User user =  (User) session.getAttribute("loginUser");
				// 如果登陆 直接放行
				if (user!= null) {
					chain.doFilter(req, resp);
				} else {
					// 否则 跳转回登陆页面
					// getContextPath : /项目名
					resp.sendRedirect(req.getContextPath()+"/login.jsp");
				}
		}
}